<template>
  <div style="background: #f4f7fd" v-loading.fullscreen.lock="loading">
    <navbar :showHeaderIcon="true" />

    <div class="app-container">
      <div class="page-card top-tabs">
        <div class="page-back" @click="$router.back()">
          <i class="el-icon-arrow-left"></i>
          返回
        </div>
        <el-tabs v-model="activeComponents" @tab-click="handleClick">
          <el-tab-pane label="总分(物理赋分)" name="总分(物理赋分)" v-if="type==2"></el-tab-pane>
          <el-tab-pane label="总分(物理)" name="总分(物理)" v-if="type==2"></el-tab-pane>
          <el-tab-pane label="总分(历史赋分)" name="总分(历史赋分)" v-if="type==1"></el-tab-pane>
          <el-tab-pane label="总分(历史)" name="总分(历史)" v-if="type==1"></el-tab-pane>
          <el-tab-pane label="总分" name="总分" v-if="type==0"></el-tab-pane>
          <el-tab-pane v-for="item in kslb" :key="`subject-${item.name}`" :label="item.name" :name="item.name"></el-tab-pane>
        </el-tabs>
      </div>
      <div class="page-card m-top">
        <h3 ref="xjcjgl">校成绩总览</h3>
        <div class="statistics-box" v-if="schoolAllSore">
          <div class="statistics-item">
            <el-card class="box-card">
              <div>
                <p>参考总人数</p>
                <p>{{ schoolAllSore && schoolAllSore.mySchoolStats && schoolAllSore.mySchoolStats.studentCount || 0 }}</p>
              </div>
            </el-card>
          </div>
          <div class="statistics-item">
            <el-card class="box-card">
              <div>
                <p>满分</p>
                <p>{{ schoolAllSore && schoolAllSore.mySchoolStats && schoolAllSore.mySchoolStats.fullScore || 0 }}</p>
              </div>
            </el-card>
          </div>
          <div class="statistics-item">
            <el-card class="box-card">
              <div>
                <p>最高分</p>
                <p>{{ schoolAllSore && schoolAllSore.mySchoolStats && schoolAllSore.mySchoolStats.highScore || 0 }}</p>
              </div>
            </el-card>
          </div>
          <div class="statistics-item">
            <el-card class="box-card">
              <div>
                <p>最低分</p>
                <p>{{schoolAllSore && schoolAllSore.mySchoolStats && schoolAllSore.mySchoolStats.lowScore || 0}}</p>
              </div>
            </el-card>
          </div>
          <div class="statistics-item">
            <el-card class="box-card">
              <div>
                <p>平均分</p>
                <p>{{schoolAllSore && schoolAllSore.mySchoolStats && schoolAllSore.mySchoolStats.avgScore || 0}}</p>
              </div>
            </el-card>
          </div>
          <div class="statistics-item">
            <el-card class="box-card">
              <div>
                <p>标准差</p>
                <p>{{schoolAllSore && schoolAllSore.mySchoolStats && schoolAllSore.mySchoolStats.deviationScore || 0}}</p>
              </div>
            </el-card>
          </div>
        </div>
        <div class="snippet">
          <h4>成绩分析</h4>
          <div class="colorBlack">
            <b>联考：</b>共<i>{{schoolAllSore && schoolAllSore.schoolInfo && schoolAllSore.schoolInfo.total}}</i>个学校、 
            共<i>{{schoolAllSore && schoolAllSore.examStats && schoolAllSore.examStats.studentCount || 0}}</i>名学生参加考试，
            参与分析人数为<i>{{schoolAllSore && schoolAllSore.examStats && schoolAllSore.examStats.effectiveStudentCount || 0}}</i>人，
            最高分为<i>{{schoolAllSore && schoolAllSore.examStats && schoolAllSore.examStats.highScore || 0}}</i>分，
            所在校级为<i>{{schoolAllSore && schoolAllSore.schoolInfo && schoolAllSore.schoolInfo.highestScoreSchool}}</i>；
            联考平均分为<i>{{schoolAllSore && schoolAllSore.examStats && schoolAllSore.examStats.avgScore || 0}}</i>分；排名前三的学校分别是
            <span v-for="(item,index) in schoolAllSore && schoolAllSore.schoolInfo && schoolAllSore.schoolInfo.top3Schools" :key="`school-${index}`">{{item.name}}（{{item.score}}分）<i v-if="index!=schoolAllSore.schoolInfo.top3Schools.length-1">、</i></span><br/>
            <b>本校：</b>共<i>{{schoolAllSore && schoolAllSore.classInfo && schoolAllSore.classInfo.totalClasses || 0}}</i>个班级、 
            共<i>{{schoolAllSore && schoolAllSore.classInfo && schoolAllSore.classInfo.totalStudents || 0}}</i>名学生参加考试，
            参与分析人数为<i>{{schoolAllSore && schoolAllSore.classInfo && schoolAllSore.classInfo.effectiveStudents || 0}}</i>人，
            最高分为<i>{{schoolAllSore && schoolAllSore.schoolInfo && schoolAllSore.schoolInfo.highestScore || 0}}</i>分，所在校级为<i>{{schoolAllSore && schoolAllSore.schoolInfo && schoolAllSore.schoolInfo.highestScoreSchool}}</i>；
            本校平均分为<i>{{schoolAllSore && schoolAllSore.schoolInfo && schoolAllSore.schoolInfo.averageScore || 0}}</i>分；排名前三的班级分别是
            <span v-for="(item,index) in schoolAllSore && schoolAllSore.classInfo && schoolAllSore.classInfo.top3Classes" :key="`class-${index}`">{{item.name}}（{{item.score}}分）<i v-if="index!=schoolAllSore.classInfo.top3Classes.length-1">、</i></span>。<br/>
            <b>本次考试总共设置了<i>{{schoolAllSore && schoolAllSore.scoreLines && schoolAllSore.scoreLines.length}}</i>个分数线：</b>
            <span v-for="(item,index) in schoolAllSore && schoolAllSore.scoreLines && schoolAllSore.scoreLines" :key="`line-${index}`">
              <i>{{item.onlineName}}</i>上线分数<i>{{item.onlineScore}}</i>分<i v-if="index!=schoolAllSore.scoreLines.length-1">、</i>
            </span>
            <template v-if="lineClasslist&&lineClasslist.length>0">
                <div v-for="(item,index) in lineClasslist" :key="'bgfex1'+index">
                  <i>{{item.onlineName}}</i>上线人数<i>{{item.onlineNumber}}</i>人，上线率<i>{{(item.onlineRate*100).toFixed(2)}}%</i> ，上线人数最多的三个班级是
                  <span v-for="(classitem,num) in item.classList" :key="'dd'+num">{{classitem.className}}({{classitem.fullScoreLineNum}})<i v-if="num!=item.classList.length-1">、</i></span>。
                </div>
            </template>
          </div>
        </div>
        <h3 ref="xjqsm">校级前10名</h3>
        <div class="snippet">
          <h4>名词解释</h4>
          <div>
            该分析提供学校前10名学生成绩详情，带有色块的分数表示该科为该生相对弱势学科，需要加强练习，提升成绩位次。
            弱势学科：科目成绩击败率低于总分成绩击败率超过2%的两个科目。
            击败率：测验中低于目标个体成绩的人数百分比，公式为：击败率=(有效参考学生人数-目标名次)
            /（有效参考学生人数-1）。
          </div>
        </div>
        <div v-if="schoolToptenlist.length==0">
            <el-empty description="暂无数据"></el-empty>
        </div>
        <el-table border stripe :data="schoolToptenlist" v-else>
            <!-- 姓名列 -->
            <el-table-column align="center" label="姓名" width="140">
              <template #default="scope">
                {{ scope.row.name || '未知' }}
              </template>
            </el-table-column>
            <!-- 总分(物理赋分) -->
            <el-table-column 
              label="总分(物理赋分)" 
              width="110"
              v-if="type === 2">
              <template #default="scope">
                {{ scope.row.endowScore }}
              </template>
            </el-table-column>
            <!-- 总分(历史赋分) -->
            <el-table-column 
              label="总分(历史赋分)" 
              width="110"
              v-if="type === 1">
              <template #default="scope">
                {{ scope.row.endowScore }}
              </template>
            </el-table-column>
            <!-- 校名次 -->
            <el-table-column align="center" label="校名次" width="80">
              <template #default="scope">
                {{ scope.row.schoolRank }}
              </template>
            </el-table-column>
            <!-- 班名次 -->
            <el-table-column align="center" label="班名次" width="80">
              <template #default="scope">
                {{ scope.row.classRank }}
              </template>
            </el-table-column>
            <!-- 总分(历史) -->
            <el-table-column 
              label="总分(历史)" 
              width="110"
              v-if="type === 1">
              <template #default="scope">
                {{ scope.row.totalScore }}
              </template>
            </el-table-column>
            <!-- 总分(物理) -->
            <el-table-column 
              label="总分(物理)" 
              width="110"
              v-if="type === 2">
              <template #default="scope">
                {{ scope.row.totalScore }}
              </template>
            </el-table-column>
            <!-- 总分 -->
            <el-table-column 
              label="总分" 
              v-if="type === 0">
              <template #default="scope">
                {{ scope.row.totalScore }}
              </template>
            </el-table-column>
            <!-- 各科成绩列 - 使用examSubjectName作为表头 -->
            <el-table-column 
              v-for="subject in subjects" 
              :key="subject" 
              :label="subject"  align="center">
              <template #default="scope">
                {{ getScore(scope.row, subject) }}
              </template>
            </el-table-column>
          </el-table>
        <h3 ref="xjzhdb">校级综合对比</h3>
        <el-table border stripe :data="schoolScoreCompareList" :max-height="600">
          <el-table-column align="center" prop="name" label="班级">
          </el-table-column>
          <el-table-column align="center" prop="effectiveStudentCount" label="参考人数">
          </el-table-column>
          <el-table-column align="center" prop="highScore" label="最高分">
          </el-table-column>
          <el-table-column align="center" prop="lowScore" label="最低分">
          </el-table-column>
          <el-table-column align="center" label="平均分">
            <el-table-column align="center" prop="avgScore" label="平均分">
            </el-table-column>
            <el-table-column align="center" prop="avgScoreRank" label="名次">
            </el-table-column>
          </el-table-column>
          <el-table-column align="center" label="满分">
            <el-table-column align="center" prop="fullScoreCount" label="人数">
            </el-table-column>
            <el-table-column align="center" label="比例(%)">
              <template slot-scope="scope">
                {{(scope.row.fullScoreRate*100).toFixed(2)}}
              </template>
            </el-table-column>
          </el-table-column>
          <el-table-column align="center" label="优秀">
            <el-table-column align="center" prop="excellentCount" label="人数">
            </el-table-column>
            <el-table-column align="center" label="比例(%)">
              <template slot-scope="scope">
                {{(scope.row.excellentRate*100).toFixed(2)}}
              </template>
            </el-table-column>
          </el-table-column>
          <el-table-column align="center" label="良好">
            <el-table-column align="center" prop="goodCount" label="人数">
            </el-table-column>
            <el-table-column align="center" label="比例(%)">
              <template slot-scope="scope">
                {{(scope.row.goodRate*100).toFixed(2)}}
              </template>
            </el-table-column>
          </el-table-column>
          <el-table-column align="center" label="及格">
            <el-table-column align="center" prop="passCount" label="人数">
            </el-table-column>
            <el-table-column align="center" label="比例(%)">
              <template slot-scope="scope">
                {{(scope.row.passRate*100).toFixed(2)}}
              </template>
            </el-table-column>
          </el-table-column>
          <el-table-column align="center" label="低分">
            <el-table-column align="center" prop="lowScoreCount" label="人数">
            </el-table-column>
            <el-table-column align="center" label="比例(%)">
              <template slot-scope="scope">
                {{(scope.row.lowScoreRate*100).toFixed(2)}}
              </template>
            </el-table-column>
          </el-table-column>
          <el-table-column align="center" label="超均率(%)" width="100">
            <template slot-scope="scope">
              {{ ((scope.row.aboveAvgRate || 0) * 100).toFixed(2) }}
            </template>
          </el-table-column>
          <el-table-column align="center" prop="deviationScore" label="标准差" width="100">
          </el-table-column>
          <el-table-column align="center" label="得分率(%)" width="100">
            <template slot-scope="scope">
              {{ ((scope.row.scoreRate || 0) * 100).toFixed(2) }}
            </template>
          </el-table-column>
        </el-table>
        <div class="snippet m-top">
          <h4>表格分析</h4>
          <div class="colorBlack">
            本校：共<i>{{schoolAllSore && schoolAllSore.classInfo && schoolAllSore.classInfo.totalClasses}}</i>个班级、
            <i>{{schoolAllSore && schoolAllSore.classInfo && schoolAllSore.classInfo.effectiveStudents}}</i>名学生参加，
            最高分为<i>{{schoolAllSore && schoolAllSore.schoolInfo && schoolAllSore.schoolInfo.highestScore}}</i>分，
            所在校级为<i>{{schoolAllSore && schoolAllSore.schoolInfo && schoolAllSore.schoolInfo.highestScoreSchool}}</i>；
            本校平均分为<i>{{schoolAllSore && schoolAllSore.schoolInfo && schoolAllSore.schoolInfo.averageScore}}</i>分；排名前三的班级分别是
            <span v-for="(item,index) in schoolAllSore && schoolAllSore.classInfo && schoolAllSore.classInfo.top3Classes" :key="`class-${index}`">{{item.name}}（{{item.score}}分）<i v-if="index!=schoolAllSore.classInfo.top3Classes.length-1">、</i></span>。
          </div>
        </div>
<!-- {{allScorerangelist[0].segments.length}} -->
        <h3 ref="zffb">总分分布</h3>
        <div class="echarts-box" ref="zffbChart"></div>

        <div class="snippet mini m-top">
          <span> 分数段默认为 </span>
          <el-select v-model="scorerangeNumber" placeholder="请选择" style="width:150px;" @change="changeScorerange">
              <el-option
                v-for="item in scorerangeList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
              </el-option>
            </el-select>
          <span> ，分数段默认上限为最高分，下限为最低分。 </span>
        </div>
        <el-table border stripe :data="allScorerangelist" :max-height="600">
          <el-table-column align="center" prop="className" label="班级">
          </el-table-column>
           <el-table-column 
              v-for="(segment, index) in allSegments" 
              :key="segment"  
              align="center"
              :width="180"
              :label="segment" 
            >
              <el-table-column 
                align="center" 
                label="本段" 
                :prop="`segments[${index}].sameScoreNumber`"  
              ></el-table-column>
              <el-table-column 
                align="center" 
                label="累计" 
                :prop="`segments[${index}].totalScoreNumber`" 
              ></el-table-column>
            </el-table-column>
        </el-table>

        <div class="snippet m-top">
          <h4>表格分析</h4>
          <div class="colorBlack">
            本次考试成绩最高分区间为
            <i>{{getScoreSegmentStatsObj&&getScoreSegmentStatsObj.maxScoreSegment&&getScoreSegmentStatsObj.maxScoreSegment.segmentInfo}}</i>，
            共<i>{{getScoreSegmentStatsObj&&getScoreSegmentStatsObj.maxScoreSegment&&getScoreSegmentStatsObj.maxScoreSegment.sameScoreNumber}}</i>人，
            占比总人数的<i>{{((getScoreSegmentStatsObj&&getScoreSegmentStatsObj.maxScoreSegment&&getScoreSegmentStatsObj.maxScoreSegment.sameScoreRate||0)*100).toFixed(2)}}%</i>。
            峰值出现在<i>{{getScoreSegmentStatsObj&&getScoreSegmentStatsObj.mostScoreSegment&&getScoreSegmentStatsObj.mostScoreSegment.segmentInfo}}</i>分区间，
            共<i>{{getScoreSegmentStatsObj&&getScoreSegmentStatsObj.mostScoreSegment&&getScoreSegmentStatsObj.mostScoreSegment.sameScoreNumber}}</i>人，
            占比总人数的<i>{{((getScoreSegmentStatsObj&&getScoreSegmentStatsObj.mostScoreSegment&&getScoreSegmentStatsObj.mostScoreSegment.sameScoreRate || 0)*100).toFixed(2)}}%</i>。
          </div>
        </div>

        <h3 ref="mcfddb">名次分段对比</h3>
        <div class="echarts-box" ref="mcfddbChart"></div>
        <!-- <div class="snippet mini m-top">
          <span> 分数段默认为 </span>
          <el-input placeholder="10分/段"></el-input>
          <span> ，分数段默认上限为最高分，下限为最低分。 </span>
        </div> -->
        <el-table :data="rankSegmentCompareList" border stripe  :max-height="600">
          <!-- 班级列 -->
          <el-table-column align="center" label="班级" prop="className" />
          <!-- 动态渲染top列 -->
          <el-table-column 
            align="center" 
            v-for="(key, index) in topKeys" 
            :key="index" 
            :label="formatLabel(key)"
          >
            <template #default="{ row }">
              {{ row[key] || 0 }}
            </template>
          </el-table-column>
        </el-table>
        <div class="excellentTitle">
          <h3 ref="yxsfb">优秀生分布</h3>
          <div>
            <span style="display:inline-block;padding-right:8px;font-size:14px;">筛选分布</span>
            <el-select v-model="excellentNumber" placeholder="请选择" style="width:150px;" @change="excellentChangescore">
              <el-option
                v-for="item in excellentList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
              </el-option>
            </el-select>
          </div>
        </div>
        <div class="echarts-box" ref="yxsfbChart"></div>
        <!-- 总分的 -->
        <div v-show="isSubject">
          <h3 ref="gkpjfdb">各科平均分对比</h3>
          <div class="snippet mini m-top">
            <span> 本次考试对应总分群体的各科平均分对比分析。 </span>
          </div>
          <el-table border stripe :data="schoolScoreCompareListavg"  :max-height="600">
            <!-- 学校名称列 -->
            <el-table-column align="center" prop="name" label="学校"></el-table-column>
            <!-- 参试人数列 -->
            <!-- <el-table-column align="center" prop="effectiveStudentCount" label="参试人数"></el-table-column> -->
            <!-- 动态生成科目列（基于examSubjectName） -->
            <el-table-column 
              v-for="subject in subjectsavg" 
              :key="subject.id" 
              :label="getSubjectLabel(subject.name)" 
              align="center">
              <!-- studentCount -->
              <el-table-column align="center" label="人数">
                <template #default="scope">
                  {{ scope.row.scores && 
                    scope.row.scores[subject.name] && 
                    scope.row.scores[subject.name].studentCount 
                    ? scope.row.scores[subject.name].studentCount 
                    : '-' 
                  }}
                </template>
              </el-table-column>
              <!-- 均分子列 -->
              <el-table-column align="center" label="均分">
                <template #default="scope">
                  {{ scope.row.scores && 
                    scope.row.scores[subject.name] && 
                    scope.row.scores[subject.name].averageScore 
                    ? scope.row.scores[subject.name].averageScore 
                    : '-' 
                  }}
                </template>
              </el-table-column>
              <!-- 名次子列 -->
              <el-table-column align="center" label="名次">
                <template #default="scope">
                  {{ scope.row.scores && 
                    scope.row.scores[subject.name] && 
                    scope.row.scores[subject.name].avgScoreRank 
                    ? scope.row.scores[subject.name].avgScoreRank 
                    : '-' 
                  }}
                </template>
              </el-table-column>
            </el-table-column>
          </el-table>

          <h3 ref="gxkjhfx">各学科均衡分析</h3>
          <div class="snippet mini m-top">
            <span>
              标准Z分=(班级平均分-年级均分)/年级标准差;班级内标准Z分最小的科目为相对势科目。
            </span>
          </div>
          <el-table border stripe :data="schoolScoreCompareListavg"  :max-height="600">
            <!-- 学校名称列 -->
            <el-table-column align="center" prop="name" label="学校"></el-table-column>
            <!-- 参试人数列 -->
            <!-- <el-table-column align="center" prop="effectiveStudentCount" label="参试人数"></el-table-column> -->
            <!-- 动态生成科目列（基于examSubjectName） -->
            <el-table-column 
              v-for="subject in subjectsavg" 
              :key="subject.id" 
              :label="getSubjectLabel(subject.name)" 
              align="center">
              <el-table-column align="center" label="人数">
                <template #default="scope">
                  {{ scope.row.scores && 
                    scope.row.scores[subject.name] && 
                    scope.row.scores[subject.name].studentCount 
                    ? scope.row.scores[subject.name].studentCount 
                    : '-' 
                  }}
                </template>
              </el-table-column>
              <!-- 均分子列 -->
              <el-table-column align="center" label="均分">
                <template #default="scope">
                  {{ scope.row.scores && 
                    scope.row.scores[subject.name] && 
                    scope.row.scores[subject.name].averageScore 
                    ? scope.row.scores[subject.name].averageScore 
                    : '-' 
                  }}
                </template>
              </el-table-column>
              <!-- Z分数 -->
              <el-table-column align="center" label="Z分数">
                <template #default="scope">
                  {{ scope.row.scores && 
                    scope.row.scores[subject.name] && 
                    scope.row.scores[subject.name].zscore 
                    ? scope.row.scores[subject.name].zscore 
                    : '-' 
                  }}
                </template>
              </el-table-column>
            </el-table-column>
          </el-table>
          <div class="snippet m-top">
            <h4>表格分析</h4>
            <div class="colorBlack">
               单学科成绩，
              <span v-for="(item,index) in getSubjectLastInfoList" :key="item.id">
                  {{item.examSubjectName}}成绩最差的班级是<i>{{item.className}}</i><i v-if="index!=getSubjectLastInfoList.length-1">、</i>
              </span>
            </div>
          </div>
          <div class="snippet danger m-top">
            <h4>划线提示</h4>
            <div>本次考试模拟划线，分数线按照各校上报人数，数据仅供参考！</div>
          </div>
          <div class="m-top">
            <h3 ref="sxqk">上线情况</h3>
            <el-table border stripe :data="comparisonList" :max-height="600">
              <!-- 分数线名称列 -->
              <el-table-column align="center" label="分数线" width="105">
                <template #default="scope">
                  {{ scope.row.lineName }}
                </template>
              </el-table-column>
              
              <!-- 动态生成科目列 -->
              <el-table-column 
                v-for="subject in subjectstab" 
                :key="subject" 
                :label="subject" 
                align="center"
                width="150">
                <template #default="scope">
                  {{ getScoreonline(scope.row, subject) }}
                </template>
              </el-table-column>
              
              <!-- 其他固定列（如果数据中存在对应科目会显示，否则显示"-"） -->
              <el-table-column align="center" :label="totalScoreLabel" width="150">
                <template #default="scope">
                  {{ getScoreonline(scope.row, '总分') }}
                </template>
              </el-table-column>
              <el-table-column align="center" label="语文" width="150">
                <template #default="scope">
                  {{ getScoreonline(scope.row, '语文') }}
                </template>
              </el-table-column>
              <el-table-column align="center" label="数学" width="150">
                <template #default="scope">
                  {{ getScoreonline(scope.row, '数学') }}
                </template>
              </el-table-column>
              <el-table-column align="center" label="英语" width="150">
                <template #default="scope">
                  {{ getScoreonline(scope.row, '英语') }}
                </template>
              </el-table-column>
            </el-table>

            <div class="snippet m-top">
              <h4>表格分析</h4>
              <div class="colorBlack" v-for="(item,index) in schoolAllSore && schoolAllSore.scoreLines && schoolAllSore.scoreLines" :key="`表格分析-${index}`"> 
                <i>{{item.onlineName}}</i>上线分数<i>{{item.onlineScore}}</i>分， 
                本校上线人数<i> {{item.onlineNumber}}</i>人，比例 <i>{{(item.onlineRate*100).toFixed(2)}}%</i>
              </div>
            </div>

            <h3 ref="zfsxl">总分上线率</h3>
            <div class="echarts-box" ref="zfsxlChart"></div>

            <h3 ref="gxksxfx">
              各学科上线分析
              <el-radio-group v-model="gksxfxTab" @change="gksxfxChange">
                <el-radio-button v-for="(item,index) in onlineList" :key="'各学科上线分析'+index" :label="item.onlinename">{{item.onlinename}}</el-radio-button>
              </el-radio-group>
            </h3>

            <div class="snippet m-top">
              <span>
                本次考试总共设置了{{onlineList.length}}个分数线，将对每个科目的单上线人数、双上线人数、命中率、贡献率、单科过线率等指标进行分析。
                单上线人数：单科上线的学生人数；双上线人数：单科上线且总分也上线的学生人数。
                命中率=（双上线人数/单科上线人数）×100%；贡献率=（双上线人数/总分上线人数）×100%
                ；单科过线率：单上线人数 / 该科参试人数 。
              </span>
            </div>

            <div class="flex">
              <el-table 
                :data="subjectAnalyseList" 
                border 
                stripe 
                style="width: 100%; margin-top: 20px;"
                v-if="subjectAnalyseList.length"
                :max-height="600"
              >
                <!-- 科目列 -->
                <el-table-column 
                  align="center" 
                  prop="examSubjectName" 
                  label="科目"
                ></el-table-column>
                <!-- 分数线列 -->
                <el-table-column 
                  align="center" 
                  prop="lineScore" 
                  label="分数线"
                ></el-table-column>
                <!-- 单上线人数列 -->
                <el-table-column 
                  align="center" 
                  prop="singleLineNum" 
                  label="单上线人数"
                ></el-table-column>
                <!-- 双上线人数列 -->
                <el-table-column 
                  align="center" 
                  prop="doubleLineNum" 
                  label="双上线人数"
                ></el-table-column>
                <!-- 命中率(%)列 -->
                <el-table-column 
                  align="center" 
                  prop="hitRate" 
                  label="命中率(%)"
                ></el-table-column>
                <!-- 贡献率(%)列 -->
                <el-table-column 
                  align="center" 
                  prop="contributionRate" 
                  label="贡献率(%)"
                ></el-table-column>
                <!-- 单科过线率(%)列 -->
                <el-table-column 
                  align="center" 
                  label="单科过线率(%)"
                >
                  <template #default="scope">
                    {{(scope.row.onlineRate*100).toFixed(2)}}
                  </template>
                </el-table-column>
              </el-table>
              <div
                class="echarts-box"
                ref="gksxfxChart"
                style="width: 500px; height: 100%"
              ></div>
            </div>

            <div class="snippet m-top">
              <h4>表格分析</h4>
              <div class="colorBlack" v-for="(item,index) in schoolAllSore && schoolAllSore.scoreLines && schoolAllSore.scoreLines" :key="`表格分析-${index}`">
                <i>{{item.onlineName}}</i>上线分数<i>{{item.onlineScore}}</i>分， 上线人数<i>{{item.onlineNumber}}</i>人，占学生人数的 <i>{{(item.examOnlineRate*100).toFixed(2)}}%</i>
              </div>
            </div>
            <h3 ref="sxrsdb">上线人数对比</h3>
            <el-table :data="onlinePeopleCompareList" border stripe :max-height="600">
              <!-- 固定列 -->
              <el-table-column align="center" label="班级" prop="className" />
              <el-table-column align="center" label="参试人数" prop="peopleNum" />
              <!-- 动态分数线 -->
                <el-table-column align="center"  v-for="line in onlineList" :key="line.onlinename" :label="line.label">
                  <el-table-column align="center" label="人数" >
                    <template #default="{row}">
                      {{ row[line.onlinename].onlineNum }}
                    </template>
                  </el-table-column>
                  <el-table-column align="center" label="上线率">
                    <template #default="{row}">
                      {{ (row[line.onlinename].onlineRate*100).toFixed(2) }}%
                    </template>
                  </el-table-column>
                </el-table-column>
            </el-table>

            <div class="snippet m-top">
              <h4>表格分析</h4>
              <div class="colorBlack">
                本次考试总共设置了<i>{{schoolAllSore && schoolAllSore.scoreLines && schoolAllSore.scoreLines.length}}</i>个分数线，
                分别是 <span v-for="(item,index) in schoolAllSore && schoolAllSore.scoreLines && schoolAllSore.scoreLines" :key="`表格分析-${index}`"> {{item.onlineName}}({{item.onlineScore}})<i v-if="index!=schoolAllSore.scoreLines.length-1">、</i></span> 。
              </div>
              <template v-if="lineClasslist&&lineClasslist.length>0">
                  <div v-for="(item,index) in lineClasslist" :key="'bgfex'+index" class="colorBlack">
                    <i>{{item.onlineName}}</i>上线人数<i>{{item.onlineNumber}}</i>人，上线率<i>{{(item.onlineRate*100).toFixed(2)}}%</i> ，上线人数最多的三个班级是
                    <span v-for="(classitem,num) in item.classList" :key="'dd'+num">{{classitem.className}}({{classitem.peopleNum}})<i v-if="num!=item.classList.length-1">、</i></span>。
                  </div>
              </template>
            </div>

            <h3 ref="mzlgxl">命中率贡献率</h3>
            <div class="snippet m-top">
              <div>
                以总分和某一单科同时上线（简称双上线）人数为分子，分别以单科上线人数和总分上线人数为分母，可以分别求得该学科对总分上线贡献率与该学科有效分上线命中率。其计算方法如下:
              </div>
              <div>学科有效分上线命中率=（双上线人数/单科上线人数）×100%</div>
              <div>运用命中率与贡献率进行评价建议：</div>
              <div>
                ① 若贡献率较大，则说明单科对总分上线贡献较大。这时还要分两种情况：
              </div>
              <div>
                a)
                若贡献率较大的同时，命中率也较大，则说明单科与总分上线配合较好，当然命中率越大越好；
              </div>
              <div>
                b)
                若贡献率较大的同时，命中率较小，说明单科上线人数虽然较多，但单科与总分上线配合不好，有投入过度之嫌。
              </div>
              <div>
                ②
                如果贡献率的值较小，则无论命中率的值大或小，单科对总分上线的贡献都较小。如果此时命中率过小，则单科就有工作对象定位不准之嫌。
              </div>
              <div>运用贡献率与命中率指标评定学科贡献等级的方法：</div>
              <div>
                ①全校在该层次分数线的总分上线人数≥30（样本数达到统计学的基本要求，以班为单位的标准由学校确定），否则评为F等。
              </div>
              <div>
                ②学科上线人数≥总分上线人数的80%，贡献率≥70%，命中率≥60%，评为A等。
              </div>
              <div>
                ③学科上线人数≥总分上线人数的80%，贡献率≥70%，命中率＜60%，评为B等。
              </div>
              <div>
                ④学科上线人数≥总分上线人数的80%，贡献率＜70%，命中率≥60%，评为C等。
              </div>
              <div>
                ⑤学科上线人数≥总分上线人数的80%，贡献率＜70%，命中率＜60%，评为D等。
              </div>
              <div>⑥学科上线人数＜总分上线人数的80%，评为E等。</div>
            </div>

            <h3>
              <div></div>
              <el-radio-group v-model="mzlgxlTab" @change="mzlgxlChange">
                <el-radio-button v-for="(item,index) in onlineList" :key="'贡献率'+index" :label="item.onlinename">{{item.onlinename}}</el-radio-button>
              </el-radio-group>
            </h3>
            <el-table 
              :data="onlinesubjectCompareList" 
              border 
              stripe
              style="width: 100%; margin-top: 20px;"
               :max-height="600"
              v-if="onlinesubjectCompareList.length && uniqueSubjects.length"
            >
              <!-- 班级列（固定） -->
              <el-table-column 
                align="center" 
                prop="className" 
                label="班级"
              ></el-table-column>
              <!-- 动态科目列（核心修改：子列prop绑定） -->
              <el-table-column 
                align="center" 
                v-for="subject in uniqueSubjects" 
                :key="subject.name"
                :label="`${subject.name}(${subject.peopleNum})`"
              >
                <template v-if="subject.name=='总分'">
                  <el-table-column 
                    align="center" 
                    :prop="`${subject.name}.fullScoreLineNum`" 
                    label="上线人数"
                    width="100"
                  ></el-table-column>
                </template>
                <template v-else>
                    <!-- 上线人数：prop = 科目名.fullScoreLineNum -->
                    <el-table-column 
                      align="center" 
                      :prop="`${subject.name}.fullScoreLineNum`" 
                      label="上线人数"
                      width="100"
                    ></el-table-column>
                    <!-- 单科上线：prop = 科目名.singleLineNum -->
                    <el-table-column 
                      align="center" 
                      :prop="`${subject.name}.singleLineNum`" 
                      label="单科上线"
                    ></el-table-column>
                    <!-- 双上线：prop = 科目名.doubleLineNum -->
                    <el-table-column 
                      align="center" 
                      :prop="`${subject.name}.doubleLineNum`" 
                      label="双上线"
                    ></el-table-column>
                    <!-- 贡献率：prop = 科目名.criticalNum -->
                    <el-table-column 
                      align="center" 
                      :prop="`${subject.name}.criticalNum`" 
                      label="贡献率"
                    ></el-table-column>
                    <!-- 命中率：prop = 科目名.hitRate -->
                    <el-table-column 
                      align="center" 
                      :prop="`${subject.name}.hitRate`" 
                      label="命中率"
                    ></el-table-column>
                </template>
              </el-table-column>
            </el-table>
            <h3 ref="sxjfdb">
              上线均分对比
              <el-radio-group v-model="sxjfdbTab" @change="changesxjfdb">
                <el-radio-button v-for="(item,index) in onlineList" :key="'上线均分'+index" :label="item.onlinename">{{item.onlinename}}</el-radio-button>
              </el-radio-group>
            </h3>
            <div class="snippet mini m-top">
              <span>
                上线学生均分：总分过线学生的各科平均分，对比各科平均分位次可以判断出学校的强弱势科目。
              </span>
            </div>
            <el-table 
              :data="onlinesubjectCompareList1" 
              border 
              stripe
              style="width: 100%; margin-top: 20px;"
              v-if="onlinesubjectCompareList1.length && uniqueSubjects.length"
               :max-height="600"
            >
              <!-- 班级列（固定） -->
              <el-table-column 
                align="center" 
                prop="className" 
                label="班级"
              ></el-table-column>
              <!-- 动态科目列（核心修改：子列prop绑定） -->
              <el-table-column 
                align="center" 
                v-for="subject in uniqueSubjects1" 
                :key="subject.name"
                :label="`${subject.name}(${subject.peopleNum})`"
              >
                <template v-if="subject.name=='总分'">
                  <el-table-column 
                    align="center" 
                    :prop="`${subject.name}.fullScoreLineNum`" 
                    label="上线人数"
                    width="100"
                  ></el-table-column>
                </template>
                <template v-else>
                    <!-- 上线人数：prop = 科目名.fullScoreLineNum -->
                    <el-table-column 
                      align="center" 
                      :prop="`${subject.name}.fullScoreLineNum`" 
                      label="上线人数"
                      width="100"
                    ></el-table-column>
                    <!-- 均分 = 科目名.singleLineNum -->
                    <el-table-column 
                      align="center" 
                      :prop="`${subject.name}.lineAvgScore`" 
                      label="均分"
                    ></el-table-column>
                    <!-- 名次 = 科目名.doubleLineNum -->
                    <el-table-column 
                      align="center" 
                      :prop="`${subject.name}.lineAvgScoreRank`" 
                      label="名次"
                    ></el-table-column>
                </template>
              </el-table-column>
            </el-table>
            <h3 ref="ljsfx">
              临界生分析
              <el-radio-group v-model="ljsfxTab" @change="changeonline">
                <el-radio-button v-for="(item,index) in onlineList" :key="'临界'+index" :label="item.onlinename">{{item.onlinename}}</el-radio-button>
              </el-radio-group>
            </h3>
            <div class="snippet mini m-top">
              <span>
                临界生：临界值定义为总分分数线±10分的学生。临界生需要关注学生的薄弱科目。
              </span>
            </div>
            <div class="echarts-box" ref="ljsfxChart"></div>
          </div>
        </div>
        <!-- 单科的 -->
        <div v-show="!isSubject">
          <!-- <div class="snippet m-top">
            <h4 ref="sjzl">试卷质量</h4>
            <div>
              试卷质量分析主要从试卷的难度、信度、和区分度三个指标进行分析。
              难度系数是指能够正确解答试题的人数和参加考试的总人数之比，即题的通过率或答对率。试题难度系数与试题试卷难易程度正好相反，难度系数越高，题目越简单。一般认为，难度系数在 0.3~0.7 之间比较合适，低于 0.3 说明试题太难，高于 0.7 说明试题太易，通常情况下，整套试卷难度系数配置比重达到 7:2:1 或 6:2:2 比较符合学校的习惯或测试的要求。
              信度是指试卷的稳定性和可靠程度。本测试采用分半信度法，信度的取值为 0~1，信度的值越大表示测验的可靠性越高。教育测量学理论认为，对于测验专业理论和能力的试卷，其信度应大于 0.70，信度在 0.70 以下的试卷不宜在该区域使用。当信度大于 0.70 时，测验可用于团体间的比较；当信度大于 0.85 时，测验可用于个体之间的比较。
              区分度是指试题区分考生能力的程度，它基于一个假设：能力高的考生比能力低的考生更有可能正确回答试题，区分度的取值在-1~1 之间，区分度指数越高，试题的区分度就越好。一般认为，区分度指数在 0.4 以上表明此题区分度很好，0.3~0.39 之间表明此题的区分度较好，0.2~0.29 之间表明此题的区分度不太好，需要修改，0.19 以下表明此题的区分度不好，应该淘汰。
            </div>
          </div> -->
          <div class="statistics-box" v-if="schoolAllSore">
            <div class="statistics-item">
              <el-card class="box-card">
                <div>
                  <p>参考总人数</p>
                  <p>{{ schoolAllSore && schoolAllSore.mySchoolStats && schoolAllSore.mySchoolStats.studentCount || 0 }}</p>
                </div>
              </el-card>
            </div>
            <div class="statistics-item">
              <el-card class="box-card">
                <div>
                  <p>满分</p>
                  <p>{{ schoolAllSore && schoolAllSore.mySchoolStats && schoolAllSore.mySchoolStats.fullScore || 0 }}</p>
                </div>
              </el-card>
            </div>
            <div class="statistics-item">
              <el-card class="box-card">
                <div>
                  <p>难度</p>
                  <p>{{ schoolAllSore && schoolAllSore.mySchoolStats && schoolAllSore.mySchoolStats.difficulty || 0 }}</p>
                </div>
              </el-card>
            </div>
            <!-- <div class="statistics-item">
              <el-card class="box-card">
                <div>
                  <p>信度</p>
                  <p>{{schoolAllSore && schoolAllSore.mySchoolStats && schoolAllSore.mySchoolStats.believe || 0}}</p>
                </div>
              </el-card>
            </div> -->
            <div class="statistics-item">
              <el-card class="box-card">
                <div>
                  <p>区分度</p>
                  <p>{{schoolAllSore && schoolAllSore.mySchoolStats && schoolAllSore.mySchoolStats.discrimination || 0}}</p>
                </div>
              </el-card>
            </div>
          </div>
          <h3 ref="sjdfl">试题得分率</h3>
           <el-table 
              border 
              stripe
              :data="tableDatarate"
              style="width: 100%; margin-top: 20px;"
              v-if="questionHeaders.length > 0"
               :max-height="600"
            >
              <el-table-column align="center" label="维度" width="120">
                <template slot-scope="scope">
                  {{ scope.row.dimension }}
                </template>
              </el-table-column>
              <el-table-column 
                v-for="(question, index) in questionHeaders" 
                :key="index" 
                :label="`${question.questionTypeName}${question.questionNumber}`"
                align="center"
              >
                <template slot-scope="scope">
                  <span class="score-value">
                    <!-- 模板直接调用实例方法，无需传 obj（已存在实例中） -->
                    {{ getScoreRate(scope.row.dimension, question.questionNumber) }}%
                  </span>
                </template>
              </el-table-column>
            </el-table>
          <!-- <el-table 
            border 
            stripe
          >
            <el-table-column align="center" label="维度"></el-table-column>
            <el-table-column align="center" label="单选1"></el-table-column>
            <el-table-column align="center" label="单选2"></el-table-column>
          </el-table> -->
          <h3 ref="stfx">试题分析</h3>
          <el-table 
            border 
            stripe
            :data="tableDataheader"
            style="width: 100%; margin-top: 20px;"
             :max-height="600"
          >
            <!-- 固定维度列 -->
            <el-table-column align="center" label="维度" width="120">
              <template slot-scope="scope">
                {{ scope.row.dimension }}
              </template>
            </el-table-column>
            
            <!-- 动态生成题目列 -->
            <el-table-column 
              v-for="(question, index) in questionDistributeList" 
              :key="index" 
              :label="`${question.questionTypeName}${question.questionNumber}`"
              align="center"
              min-width="180"
            >
              <template slot-scope="scope">
                <!-- 解析answer为JSON对象 -->
                <template v-if="scope.row.dimension === '难度'">
                  <span class="difficulty">{{ question.difficulty }}%</span>
                </template>
                
                <template v-if="scope.row.dimension === '区分度'">
                  <span class="discrimination">{{ question.degree }}%</span>
                </template>
              </template>
            </el-table-column>
          </el-table>
          <!-- <el-table 
            border 
            stripe
          >
            <el-table-column align="center" label="维度"></el-table-column>
            <el-table-column align="center" label="单选1"></el-table-column>
            <el-table-column align="center" label="单选2"></el-table-column>
          </el-table> -->
          <h3 ref="stzdfb">试题作答分布</h3>
          <el-table 
            border 
            stripe
            :data="questionDistributeList"
            :max-height="600"
          >
            <el-table-column align="center" label="试题">
              <template slot-scope="scope">
                {{scope.row.questionTypeName}}{{scope.row.questionNumber}}
              </template>
            </el-table-column>
            <el-table-column align="center" label="答案" prop="standardAnswer">
              <template slot-scope="scope">
                {{scope.row.standardAnswer?scope.row.standardAnswer:'-'}}
              </template>
            </el-table-column>
            <el-table-column align="center" label="分值" prop="fullScore"></el-table-column>
            <el-table-column align="center" label="平均分" prop="avgScore"></el-table-column>
            <el-table-column align="center" label="得分率(%)">
              <template slot-scope="scope">
                {{(scope.row.rateScore*100).toFixed(2)}}
              </template>
            </el-table-column>
            <el-table-column align="center" label="满分率(%)">
              <template slot-scope="scope">
                {{(scope.row.rateScoreFull).toFixed(2)}}
              </template>
            </el-table-column>
            <el-table-column align="center" label="零分率(%)">
              <template slot-scope="scope">
                {{(scope.row.rateScoreZero*100).toFixed(2)}}
              </template>
            </el-table-column>
            <el-table-column align="center" label="学生作答" width="500">
              <template slot-scope="scope">
                <span 
                  v-for="(item, index) in scope.row.parsedAnswer" 
                  :key="item.segment"
                >
                {{ item.segment ? item.segment : item.option }}
                  占({{ (item.ration*100).toFixed(2) }}%)
                  <i v-if="index < scope.row.parsedAnswer.length - 1">、</i>
                </span>
              </template>
            </el-table-column>
          </el-table>
        </div>
      </div>
    </div>

    <div class="roll">
      <el-dropdown @command="handleCommand">
        <div>
          <i class="el-icon-more"></i>
        </div>
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item disabled>成绩分析</el-dropdown-item>
          <el-dropdown-item command="xjcjgl">校成绩总览</el-dropdown-item>
          <el-dropdown-item command="xjqsm">校级前十名</el-dropdown-item>
          <el-dropdown-item command="xjzhdb">校级综合对比</el-dropdown-item>
          <el-dropdown-item command="zffb">总分分布</el-dropdown-item>
          <el-dropdown-item command="mcfddb">名次分段对比</el-dropdown-item>
          <el-dropdown-item command="yxsfb">优秀生分布</el-dropdown-item>
          <template v-if="isSubject">
              <el-dropdown-item command="gkpjfdb">各科平均分对比</el-dropdown-item>
              <el-dropdown-item command="gxkjhfx">各学科均衡分析</el-dropdown-item>
              <el-dropdown-item divided disabled>上线分析</el-dropdown-item>
              <el-dropdown-item command="sxqk">上线情况</el-dropdown-item>
              <el-dropdown-item command="zfsxl">总分上线率</el-dropdown-item>
              <el-dropdown-item command="gxksxfx">各学科上线分析</el-dropdown-item>
              <el-dropdown-item command="sxrsdb">上线人数对比</el-dropdown-item>
              <el-dropdown-item command="mzlgxl">命中率贡献率</el-dropdown-item>
              <el-dropdown-item command="sxjfdb">上线均分对比</el-dropdown-item>
              <el-dropdown-item command="ljsfx">临界生分析</el-dropdown-item>
          </template>
          <template v-else>
            <el-dropdown-item divided disabled>试卷分析</el-dropdown-item>
            <!-- <el-dropdown-item command="sjzl">试卷质量</el-dropdown-item> -->
            <el-dropdown-item command="sjdfl">试题得分率</el-dropdown-item>
            <el-dropdown-item command="stfx">试题分析</el-dropdown-item>
            <el-dropdown-item command="stzdfb">试题作答分布</el-dropdown-item>
          </template>
        </el-dropdown-menu>
      </el-dropdown>
    </div>

    <div class="roll roll-top" @click="backTop">
      <div>
        <i class="el-icon-top"></i>
      </div>
    </div>
  </div>
</template>

<script>
import * as echarts from "echarts";
import { Navbar } from "@/layout/components";
import { 
  subjectGetlist,
  allScorelist,
  allScorerange,
  schoolTopten,
  schoolScoreCompare,
  excellentStudents,
  comparison,
  subjectschoolScoreCompare,
  onlinePeopleCompare,
  onlinesubjectCompare,
  rankSegmentCompare,
  onlineRate,
  subjectAnalyse,
  questionDistribute,
  questionScoreRate,
  subjectCompare,
  getScoreSegmentStats,
  getSubjectLastInfo
 } from "@/api/cjfx/cjfx"
export default {
  name: "Cjfx_xjfxgb",
  components: {
    Navbar,
  },
  data() {
    return {
      loading: false,
      activeName: "1",
      zffbChart: null,
      mcfddbChart: null,
      yxsfbChart: null,
      zfsxlChart: null,
      gksxfxChart: null,
      ljsfxChart: null,
      gksxfxTab: "",
      mzlgxlTab: "",
      sxjfdbTab: "",
      ljsfxTab: "",
      xmxx:{},
      type:'',
      kslb:[],
      fftype:1,
      activeComponents:'',
      schoolAllSore:{},
      excellentList:[
        {
          name:'前10名人数分布',
          id:10
        },
        {
          name:'前20名人数分布',
          id:20
        },
        {
          name:'前50名人数分布',
          id:50
        },
        {
          name:'前100名人数分布',
          id:100
        },
        {
          name:'前200名人数分布',
          id:200
        }
      ],
      excellentNumber:10,
      scorerangeNumber:10,
      scorerangeList:[{id:10,name:'10分/段'},{id:20,name:'20分/段'},{id:50,name:'50分/段'}],
      allScorerangelist:[],
      allSegments: [],
      scoreType:2,
      schoolToptenlist:[],
      subjects:[],
      schoolScoreCompareList:[],
      schoolScoreCompareListavg:[],
      subjectstab:[],
      comparisonList:[],
      subjectsavg:[],
      onlineList:[],
      onlinePeopleCompareList:[],
      yshjdate:[],
      rankSegmentCompareList:[],
      topKeys:[],
      uniqueSubjects:[],
      uniqueSubjects1:[],
      onlinesubjectCompareList:[],
      onlinesubjectCompareList1:[],
      isSubject:true,
      subjectId:'',
      subjectAnalyseList:[],
      questionDistributeList:[],
      // 表格数据 - 固定维度
      tableDataheader: [
        { dimension: '难度' },
        { dimension: '区分度' }
      ],
      questionScoreRateList:[],
      tableDatarate:[],
      firstDimension:[],
      questionHeaders:[],
      getScoreSegmentStatsObj:{},
      lineClasslist:[],
      getSubjectLastInfoList:[]
    };
  },
  computed: {
    // 计算属性处理表头显示逻辑
    totalScoreLabel() {
      // 将路由参数转为数字类型再判断
      const type = Number(this.$route.query.type);
      if (type == 2) {
        return '总分(物理赋分)';
      } else if (type == 1) {
        return '总分(历史赋分)';
      } else {
        return '总分';
      }
    }
  },
  mounted() {
    this.xmxx = JSON.parse(sessionStorage.getItem('analysisXmxx'))
    this.type=this.$route.query.type
    //获取学科
    this.subjectlisttap(this.xmxx.id)
    //校级总览
    // this.fftype = this.$route.query.type==2?1:0
    this.activeComponents = this.$route.query.type==2?'总分(物理赋分)':'总分(历史赋分)'
    this.allScorelisttap(this.xmxx.id,this.fftype)
    //校级前10名
    this.schooltoptentap(this.xmxx.id)
    //校级综合对比
    this.schoolScoreComparetap(this.xmxx.id)
    // 总分分布
    this.zffbChart = echarts.init(this.$refs.zffbChart);
    this.getZffb(this.xmxx.id);
    this.getScoreSegmentStatsTap(this.xmxx.id)
    // 名次分段对比
    this.mcfddbChart = echarts.init(this.$refs.mcfddbChart);
    this.rankSegmentCompareTap(this.xmxx.id);
    // 优秀生分布
    this.yxsfbChart = echarts.init(this.$refs.yxsfbChart);
    this.getYxsfb(this.xmxx.id);
    //各科平均分均衡分析对比subjectschoolScoreCompare
    this.subjectschoolScoreCompareTap(this.xmxx.id)
    this.getSubjectLastInfo(this.xmxx.id)
    //上线情况
    this.comparisonTap(this.xmxx.id)
    // 总分上线率
    this.zfsxlChart = echarts.init(this.$refs.zfsxlChart);
    this.getZfsxl(this.xmxx.id);
    //上线人数对比
    this.onlinePeopleCompareTap(this.xmxx.id)
    // 各科上线分析
    setTimeout(()=>{
      this.gksxfxChart = echarts.init(this.$refs.gksxfxChart);
      this.getGksxfx(this.xmxx.id);
      //命中率贡献率
      this.onlinesubjectCompareTap(this.xmxx.id)
      // 各科上线分析
    },500)
    this.ljsfxChart = echarts.init(this.$refs.ljsfxChart);
    // this.getLjsfx(this.xmxx.id);
  },
  methods: {
    //获取学科列表
    subjectlisttap(id){
        subjectGetlist({ examId: id,subjectGroup:this.$route.query.type,endowFlag:this.fftype }).then(
          (response) => {
            if(response.code==200){
              this.kslb = response.data;
            }else{
              this.$message({
                message: res.msg,
                type: 'warning'
              });
            }
            
          }
        ).catch((error) => {
          // 捕获请求失败（如网络错误、超时等）
          console.error('分数数据请求失败：', error);
          this.$message({
            message: '网络异常，获取分数数据失败',
            type: 'error'
          });
        });
    },
    //校级总览
    allScorelisttap(id,fftype){
        let obj={
          subjectId:this.subjectId?this.subjectId:undefined,
          examId: id,subjectGroup:this.$route.query.type,endowFlag:fftype
        }
        allScorelist(obj).then(
          (response) => {
            if(response.code==200){
              this.schoolAllSore = response.data?response.data:{}
              const classDataMap = new Map();
              response.data.scoreLinesClassTop3.forEach(item => {
                classDataMap.set(item.lineName, item.scoreLines);
              });
              // 2. 合并数据：以 schoolData 为基础，关联 classData 的班级列表
              const mergedData = response.data.scoreLines.map(schoolItem => {
                const lineName = schoolItem.onlineName;
                return {
                  // 保留全校维度数据（来自第一个数组）
                  ...schoolItem,
                  // 关联班级维度数据（来自第二个数组，若没有则为空数组）
                  classList: classDataMap.get(lineName) || []
                };
              });
              this.lineClasslist = mergedData
              console.info(this.lineClasslist,'lineClasslist')
            }else{
              this.$message({
                message: res.msg,
                type: 'warning'
              });
            }
            
          }
        ).catch((error) => {
          // 捕获请求失败（如网络错误、超时等）
          console.error('分数数据请求失败：', error);
          this.$message({
            message: '网络异常，获取分数数据失败',
            type: 'error'
          });
        });
    },
    //校级前10名
    getScore(student, subjectName) {
      const scoreItem = student.scores.find(
        item => item.examSubjectName === subjectName
      );
      return scoreItem ? scoreItem.score : '-';
    },
    async schooltoptentap(id){
      try {
          let obj={
            examId:id,
            endowFlag:this.fftype,
            subjectGroup:this.$route.query.type,
            subjectId:this.subjectId?this.subjectId:undefined,
          }
          const res = await schoolTopten(obj)
          if(res&&res.code==200){
            // 假设 res.data 已赋值给 this.schoolToptenlist
            this.schoolToptenlist = res.data;

            // 核心：将 scores 中的 studentName 复制到外层 name
            this.schoolToptenlist.forEach(student => {
              // 取 scores 数组第一个元素的 studentName（若数组为空则设为''）
              if (student.scores && student.scores.length > 0) {
                student.name = student.scores[0].studentName;
              } else {
                student.name = ''; // 处理 scores 为空的极端情况
              }
            });

            // 后续提取科目表头的逻辑（保持不变）
            const subjectSet = new Set();
            this.schoolToptenlist.forEach(student => {
              student.scores.forEach(score => {
                // 注意：原代码判断的是 score.score，若字段名不同需调整（如 score.studentName）
                if (score.studentName !== null) { // 按实际字段调整判断条件
                  subjectSet.add(score.examSubjectName);
                }
              });
            });
            this.subjects = Array.from(subjectSet);
          }else{
            // this.$message({
            //   type:'warning',
            //   message:res.msg
            // })
          }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败1：', error); // 打印错误日志，便于排查
          this.$message({
            type: 'error',
            message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          });
      }
    },
    //校级综合对比
    async schoolScoreComparetap(id){
      try {
          let obj={
            examId:id,
            endowFlag:this.fftype,
            subjectGroup:this.$route.query.type,
            subjectId:this.subjectId?this.subjectId:undefined,
          }
          const res=await schoolScoreCompare(obj)
          if(res.code==200){
            this.schoolScoreCompareList= res.data.map(item => {
              // 获取每个对象的唯一键
              const name = Object.keys(item)[0];
              // 返回新对象，包含name和对应的属性
              return {
                name: name,
                ...item[name]
              };
            });
            // console.info(this.schoolScoreCompareList,'schoolScoreCompareList')
          }else{
            this.$message({
              type:'warning',
              message:res.msg
            })
          }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败2：', error); // 打印错误日志，便于排查
          this.$message({
            type: 'error',
            message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          });
      }
    },
    handleClick(tab, event) {
      // console.info(tab,'dddddd')
      this.fftype = tab.name.includes('赋分')?1:0
      this.scoreType= tab.name.includes('总分')?2:1
      this.isSubject = tab.name.includes('总分')
      this.activeComponents = tab.name;
      this.subjectId = []
      if(!tab.name.includes('总分')){
        this.subjectTitle = tab.name
        let subjectObj = this.kslb.filter(item=>{return item.name==tab.name})
        this.subjectId = subjectObj[0].id
        this.getZffb(this.xmxx.id)
        this.allScorelisttap(this.xmxx.id,this.fftype)
        this.schooltoptentap(this.xmxx.id)
        this.schoolScoreComparetap(this.xmxx.id)
        this.getZffb(this.xmxx.id)
        this.rankSegmentCompareTap(this.xmxx.id)
        this.getYxsfb(this.xmxx.id)
        this.subjectschoolScoreCompareTap(this.xmxx.id)
        this.questionDistributetab()
        this.questionScoreRateTab()
        this.getScoreSegmentStatsTap(this.xmxx.id)
        setTimeout(()=>{
          this.gksxfxChart = echarts.init(this.$refs.gksxfxChart);
          this.getGksxfx(this.xmxx.id);
          //命中率贡献率
          this.onlinesubjectCompareTap(this.xmxx.id)
          // 各科上线分析
        },500)
      }else{
        this.getZffb(this.xmxx.id)
        this.allScorelisttap(this.xmxx.id,this.fftype)
        this.schooltoptentap(this.xmxx.id)
        this.schoolScoreComparetap(this.xmxx.id)
        this.getZffb(this.xmxx.id)
        this.rankSegmentCompareTap(this.xmxx.id)
        this.getYxsfb(this.xmxx.id)
        this.subjectschoolScoreCompareTap(this.xmxx.id)
        this.comparisonTap(this.xmxx.id)
        this.getZfsxl(this.xmxx.id)
        this.onlinePeopleCompareTap(this.xmxx.id)
        this.onlinesubjectCompareTap(this.xmxx.id)
        this.getScoreSegmentStatsTap(this.xmxx.id)
      }
    },
    //切换分数段
    changeScorerange(val){
        this.scorerangeNumber=val
        this.getZffb(this.xmxx.id)
    },
    //上线人数对比
    async onlinePeopleCompareTap(id){
      try {
          let obj={
            examId:id,
            subjectGroup:this.$route.query.type,
            isEndow:this.fftype
          }
          const res = await onlinePeopleCompare(obj)
          if(res.code==200){
            this.yshjdate = res.data
            console.info(res.data,'res.data')
            // this.onlineList = res.data.map(item => Object.keys(item)[0]);
            this.onlineList = res.data.map((item, index) => {
              const line = Object.keys(item)[0]; // 分数线类型（如'特控(一本)线'）
              const lineArray = item[line]; // 分数线对应的数组
              const firstItemInArray = lineArray[0]; // 数组第一个元素
              const firstClassKey = Object.keys(firstItemInArray)[0]; // 第一个班级key
              const peopleNum = firstClassKey 
                ? (firstItemInArray[firstClassKey]?.[0]?.peopleNum || 0)
                : 0;
              return {
                label: `${line}(${peopleNum})`,
                onlinename: line
              };
            });
            if (this.onlineList.length > 0) {
              this.mzlgxlTab = this.onlineList[0].onlinename;
              this.sxjfdbTab = this.onlineList[0].onlinename;
              this.ljsfxTab = this.onlineList[0].onlinename;
              this.gksxfxTab = this.onlineList[0].onlinename;
            }
            const classMap = new Map(); // 用班级标识（21/22）作为key，确保唯一
            if (res.data && res.data.length > 0) {
              // 遍历每类分数线（一本/二本）
              res.data.forEach(lineItem => {
                // 提取当前分数线类型（如"特控(一本)线"）和对应的班级嵌套数据
                const [lineKey, classNestedObj] = Object.entries(lineItem)[0]; 
                // 遍历当前分数线对应的所有“班级标识→嵌套对象”
                Object.entries(classNestedObj).forEach(([outerClassKey, rawNestedData]) => {
                  // 核心：提取内层真正的班级数据对象（rawNestedData 是 {21: {...}}，需取其值）
                  const [_, realClassData] = Object.entries(rawNestedData)[0]; 
                  // realClassData 才是包含 className/peopleNum 等字段的真实数据
                  // 2. 初始化班级基础信息（仅第一次遇到该班级时执行）
                  if (!classMap.has(outerClassKey)) {
                    classMap.set(outerClassKey, {
                      className: realClassData.className, // 班级名称（如"21"）
                      peopleNum: realClassData.peopleNum || 0, // 参试人数（52）
                      // 为所有分数线类型预留空对象（后续填充数据）
                      ...Object.fromEntries(this.onlineList.map(k => [k, {}]))
                    });
                  }
                  // 3. 填充分数线数据（当前班级+当前分数线）
                  classMap.get(outerClassKey)[lineKey] = {
                    onlineNum: realClassData.fullScoreLineNum, // 上线人数（18）
                    onlineRate: realClassData.onlineRate,
                  };
                });
              });
            }
            this.onlinePeopleCompareList = [...classMap.values()].slice(1);
            //临界生分析
            const findData = (arr, key) => {
              // 遍历数组中的每个对象
              for (const item of arr) {
                // 检查当前对象是否包含目标键
                if (item.hasOwnProperty(key)) {
                  // 返回找到的对应值
                  return item[key];
                }
              }
              // 如果没有找到，返回null或空数组
              return null;
            };
            // 执行查找
            const result = findData(res.data, this.ljsfxTab).slice(1);
            // 去掉外层key，提取内层数据
            const ljsfxChartList = result.map(item => {
              // Object.values(item) 会返回当前对象的所有值组成的数组（此处只有1个值）
              return Object.values(item)[0];
            });
            // console.info(ljsfxChartList,'ljsfxChartList')
            this.getLjsfx(ljsfxChartList)
          }else{
            this.$message({
              type:'warning',
              message:res.msg
            })
          }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败10：', error); // 打印错误日志，便于排查
          // this.$message({
          //   type: 'error',
          //   message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          // });
      }
    },
    async getZffb(id) {
      try {
          let obj={
            examId:id,
            endowFlag:this.fftype,
            subjectGroup:this.$route.query.type,
            segmentInterval:this.scorerangeNumber,
            scoreType:this.scoreType,
            subjectId:this.subjectId?this.subjectId:undefined,
          }
          // 注意：await 和 .then() 不要同时使用，会导致逻辑混乱
            const res = await allScorerange(obj); // 直接使用await获取结果
            if (res.code === 200) {
              const segmentsSet = new Set();
              // 1. 转换数据并同时赋值给allScorerangelist（关键修复）
              this.allScorerangelist = res.data.map(item => {
                const className = Object.keys(item)[0];
                const segments = item[className];
                segments.forEach(seg => segmentsSet.add(seg.segmentInfo));
                return {
                  className,
                  segments
                };
              });
              // 2. 同时将转换后的数据赋值给tableData（如果需要）
              this.tableData = this.allScorerangelist;
              // 3. 转换分数段集合为数组
              this.allSegments = Array.from(segmentsSet);
              // 调试：检查allScorerangelist是否有数据
              // console.log('allScorerangelist长度:', this.allScorerangelist.length);
              // console.log('allScorerangelist内容:', this.allScorerangelist);
              // 4. 现在循环应该能执行了（因为allScorerangelist已经有数据）
              this.allScorerangelist.forEach((row, index) => {
                const sortedSegments = [];
                this.allSegments.forEach(segInfo => {
                  // 容错处理：确保row.segments是数组
                  const rowSegments = Array.isArray(row.segments) ? row.segments : [];
                  // 优化匹配逻辑（处理格式差异）
                  const found = rowSegments.find(s => {
                    if (!s || !s.segmentInfo) return false;
                    // 去除空格后比较
                    return s.segmentInfo.trim() === segInfo.trim();
                  });
                  sortedSegments.push(found || {
                    segmentInfo: segInfo,
                    sameScoreNumber: 0,
                    totalScoreNumber: 0
                  });
                });
                row.segments = sortedSegments;
              });
            }
            // console.info(this.allScorerangelist,'this.allScorerangelist')
            // let lkline=this.allScorerangelist[0].segments.map(item=>item.sameScoreNumber)
            // let schoolline = this.allScorerangelist[1].segments.map(item=>item.sameScoreNumber)
            if (this.allScorerangelist.length >= 2) {
              let lkline = this.allScorerangelist[0].segments?.map(item => item.sameScoreNumber) || [];
              let schoolline = this.allScorerangelist[1].segments?.map(item => item.sameScoreNumber) || [];
               this.zffbChart.setOption({
                  tooltip: {
                    trigger: "axis",
                  },
                  legend: {
                    data: ["统考全体", "本校"],
                  },
                  grid: {
                    left: "3%",
                    right: "4%",
                    bottom: "3%",
                    containLabel: true,
                  },
                  xAxis: {
                    type: "category",
                    boundaryGap: false,
                    data: this.allSegments,
                  },
                  yAxis: {
                    type: "value",
                  },
                  series: [
                    {
                      name: "统考全体",
                      type: "line",
                      stack: "Total",
                      data: lkline,
                    },
                    {
                      name: "本校",
                      type: "line",
                      stack: "Total",
                      data:schoolline,
                    },
                  ],
                });
            } else {
              // 数据不足时的降级处理（如清空图表或显示提示）
               this.zffbChart.setOption({
            tooltip: {
              trigger: "axis",
            },
            legend: {
              data: ["统考全体", "本校"],
            },
            grid: {
              left: "3%",
              right: "4%",
              bottom: "3%",
              containLabel: true,
            },
            xAxis: {
              type: "category",
              boundaryGap: false,
              data: this.allSegments,
            },
            yAxis: {
              type: "value",
            },
            series: [
              {
                name: "统考全体",
                type: "line",
                stack: "Total",
                data: [],
              },
              {
                name: "本校",
                type: "line",
                stack: "Total",
                data:[],
              },
            ],
          });
              // 可选：提示用户数据不足
              // this.$message.warning('数据不足，无法生成完整图表');
        }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败3：', error); // 打印错误日志，便于排查
          // this.$message({
          //   type: 'error',
          //   message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          // });
      }
    },
    async getScoreSegmentStatsTap(id){
      try {
        let obj={
          examId:id,
          endowFlag:this.fftype,
          subjectGroup:this.$route.query.type,
          segmentInterval:this.scorerangeNumber,
          scoreType:this.scoreType,
          subjectId:this.subjectId?this.subjectId:undefined,
        }
        const res = await getScoreSegmentStats(obj)
        if(res.code==200){
          this.getScoreSegmentStatsObj = res.data
        }else{
          // this.$message({
          //   type:"warning",
          //   message:res.msg
          // })
        }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败4：', error); // 打印错误日志，便于排查
          // this.$message({
          //   type: 'error',
          //   message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          // });
      }
    },
  // 格式化表头文字（top50 -> 前50名）
    formatLabel(key) {
      const num = key.replace('top', '');
      return `前${num}名`;
    },  
    async rankSegmentCompareTap(id) {
      try {
          let obj={
            examId:id,
            subjectId:this.subjectId?this.subjectId:undefined,
            endowFlag:this.fftype,
            subjectGroup:this.$route.query.type,
          }
          const res = await rankSegmentCompare(obj)
          if(res.code==200){
              this.topKeys = res.data.map(item => Object.keys(item)[0]);
              console.info(this.topKeys,'this.topKeys')
                // 2. 收集所有班级名称（去重）
                const classNames = new Set();
                res.data.forEach(topItem => {
                  const topKey = Object.keys(topItem)[0]; // 当前top类型（如top50）
                  const classData = topItem[topKey]; // 对应的班级数据数组
                  classData.forEach(item => {
                    const className = Object.keys(item)[0]; // 提取班级名（如'22'、'全校'）
                    classNames.add(className);
                  });
                });
                // 3. 构建表格数据：每个班级一行，包含所有top类型的数据
                this.rankSegmentCompareList = Array.from(classNames).map(className => {
                  const row = { className }; // 行数据：基础字段为班级名
                  // 为每个top类型填充对应的值
                  this.topKeys.forEach(topKey => {
                    // 找到当前top类型对应的数组（如top50对应的数组）
                    const topItem = res.data.find(item => Object.keys(item).includes(topKey));
                    if (topItem) {
                      // 在当前top数组中查找班级数据
                      const classItem = topItem[topKey].find(item => Object.keys(item).includes(className));
                      row[topKey] = classItem ? Object.values(classItem)[0] : 0;
                    } else {
                      row[topKey] = 0;
                    }
                  });
                  return row;
              });
                // console.info(classNames,'rankSegmentCompareList')
                // console.info(this.topKeys,'this.topKeys')
                const series = res.data.map(item => {
                  // 获取当前top类型的key（如'top50'）
                  const topKey = Object.keys(item)[0];
                  // 提取名称（top50 -> 前50名）
                  const name = `前${topKey.replace('top', '')}名`;
                  // 提取数据值（按原顺序转换为数组）
                  const data = item[topKey].map(classItem => Object.values(classItem)[0]);
                  return {
                    name,
                    type: "line",
                    stack: "Total",
                    data
                  };
                });
                this.mcfddbChart.setOption({
                tooltip: {
                  trigger: "axis",
                },
                legend: {
                  data: this.topKeys,
                },
                grid: {
                  left: "3%",
                  right: "4%",
                  bottom: "3%",
                  containLabel: true,
                },
                xAxis: {
                  type: "category",
                  boundaryGap: false,
                  data: Array.from(classNames),
                },
                yAxis: {
                  type: "value",
                },
                series:series
              });
          }else{
            this.$message({
              type:"warning",
              message:res.msg
            })
          }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败5：', error); // 打印错误日志，便于排查
          // this.$message({
          //   type: 'error',
          //   message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          // });
      }
    },
    excellentChangescore(val){
      this.excellentNumber = val
      this.getYxsfb(this.xmxx.id)
    },
    //优秀生分布
    async getYxsfb(id) {
      try {
          let obj={
            examId:id,
            subjectId:this.subjectId?this.subjectId:undefined,
            endowFlag:this.fftype,
            subjectGroup:this.$route.query.type,
          }
          const res= await excellentStudents(obj)
          if(res.code==200){
            const key = `top${this.excellentNumber}`;
            const filteredData = res.data.hasOwnProperty(key) ? res.data[key] : null;
            // console.info(filteredData,'filteredData')
            const distribution = filteredData.distribution;
            // 提取键组成数组（会自动转为字符串类型）
            const keysArray = Object.keys(distribution);
            // 提取值组成数组
            const valuesArray = Object.values(distribution);
            this.yxsfbChart.setOption({
              xAxis: {
                type: "category",
                data: keysArray,
              },
              yAxis: {
                type: "value",
              },
              series: [
                {
                  data: valuesArray,
                  type: "bar",
                },
              ],
            });
          }else{
            // this.$message({
            //   type:'warning',
            //   message:res.msg
            // })
          }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败6：', error); // 打印错误日志，便于排查
          // this.$message({
          //   type: 'error',
          //   message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          // });
      }
    },
    async getSubjectLastInfo(id){
      try {
          let obj={
            examId:id
          }
          const res = await getSubjectLastInfo(obj)
          const flattenedArray = res.data.flatMap(item => {
            // 获取当前对象的唯一键（即科目名，如'政治'）
            const subjectName = Object.keys(item)[0];
            // 获取对应的数据对象
            const subjectData = item[subjectName];
            // 合并：新增subjectName字段，保留原数据所有字段
            return {
              subjectName: subjectName, // 新增：科目名
              ...subjectData // 展开原数据对象
            };
          });
          this.getSubjectLastInfoList = flattenedArray
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败7：', error); // 打印错误日志，便于排查
          // this.$message({
          //   type: 'error',
          //   message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          // });
      }
    },
    //各科平均分对比/各学科均衡分析
    async subjectschoolScoreCompareTap(id){
      try {
            let obj={
              examId:id,
              endowFlag:this.fftype,
              subjectId:this.subjectId?this.subjectId:undefined,
              subjectGroup:this.$route.query.type,
            }
            const res=await subjectschoolScoreCompare(obj)
            if(res.code==200){
              // 修正数据处理逻辑
              const subjectMap = {};
              // 处理原始数据
              this.schoolScoreCompareListavg = res.data.map(item => {  // 这里使用你的array示例数据
                const schoolName = Object.keys(item)[0];
                const subjects = item[schoolName];
                const scoreMap = {};
                
                subjects.forEach(subject => {
                  console.info(subject,'subject')
                  // 关键修复：使用科目名称作为唯一标识（因为数据中没有subjectId）
                  // 或者为重复科目生成唯一ID
                  const uniqueKey = subject.examSubjectName;
                  
                  // 收集所有科目（去重）- 现在基于科目名称去重
                  if (!subjectMap[uniqueKey]) {
                    subjectMap[uniqueKey] = {
                      id: uniqueKey,  // 使用科目名称作为ID
                      name: subject.examSubjectName
                    };
                  }
                  
                  // 存储分数数据 - 如果有重复科目，保留最后一个值
                  // 或者可以在这里处理重复数据（如求平均值）
                  scoreMap[uniqueKey] = {
                    averageScore: subject.avgScore || '-',  // 处理可能的undefined
                    avgScoreRank: subject.avgScoreRank,
                    zscore:subject.zscore || '-',
                    studentCount:subject.studentCount
                  };
                });
                
                return {
                  name: schoolName,
                  effectiveStudentCount: subjects[0]?.effectiveStudentCount || 0,
                  scores: scoreMap
                };
              });
              console.info(this.schoolScoreCompareListavg,'schoolScoreCompareListavg')
              // 转换为数组作为表头
              this.subjectsavg = Object.values(subjectMap);
            }else{
              // this.$message({
              //   type:'warning',
              //   message:res.msg
              // })
            }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败8：', error); // 打印错误日志，便于排查
          // this.$message({
          //   type: 'error',
          //   message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          // });
      }
    },
    // 根据类型处理科目显示名称（主要针对总分）
    getSubjectLabel(subjectName) {
      if (subjectName === '总分') {
        switch(this.type) {
          case 2: return '总分(物理赋分)';
          case 1: return '总分(历史赋分)';
          default: return '总分';
        }
      }
      return subjectName;
    },
    //上线情况
    getScoreonline(row, subject) {
      const value = row[subject];
      // console.log(`科目: ${subject}, 存在: ${row.hasOwnProperty(subject)}, 值: ${value}`);
      return row.hasOwnProperty(subject) ? value : '-';
    },
    async comparisonTap(id){
      try {
          let obj={examId: id,subjectGroup:this.$route.query.type,isEndow:this.fftype}
          const res= await comparison(obj)
          if(res.code==200){
            // 提取所有科目名称
            const subjectSet = new Set();
            // 处理原始数据为表格需要的格式
            this.comparisonList = res.data.map(item => {
              const lineName = Object.keys(item)[0];
              let scores = item[lineName];
              // 先按examSubjectId对scores数组进行排序
              scores = scores.sort((a, b) => {
                // 按examSubjectId升序排列，确保0也会被正确排序
                return a.subjectId - b.subjectId;
              });
              // 创建行数据对象
              const rowData = { lineName: lineName };
              
              // 处理排序后的科目
              scores.forEach(score => {
                subjectSet.add(score.examSubjectName);
                rowData[score.examSubjectName] = score.lineScore;
              });
              return rowData;
            });
              this.subjectstab = Array.from(subjectSet); 
          }else{
            // this.$message({
            //   type:'warning',
            //   message:res.msg
            // })
          }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败9：', error); // 打印错误日志，便于排查
          // this.$message({
          //   type: 'error',
          //   message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          // });
      }
    },
    async getZfsxl(id) {
      let obj={
        examId:id,
        subjectGroup:this.$route.query.type,
        isEndow:this.fftype
      }
      const res = await onlineRate(obj)
      if(res.code==200){
          const result = {
            xAxis: [], // 存放key值作为x轴坐标
            seriesData: [] // 存放对应的onlineRate值
          };
          res.data.forEach(item => {
          // 获取每个对象的key（如"特控(一本)线"、"本科(二本)线"）
          const key = Object.keys(item)[0];
          // 获取对应的value数组中的第一个对象的onlineRate
          const onlineRate = item[key][0].onlineRate;
          result.xAxis.push(key);
          result.seriesData.push(onlineRate);
          this.zfsxlChart.setOption({
              xAxis: {
                type: "category",
                data: result.xAxis,
              },
              yAxis: {
                type: "value",
              },
              series: [
                {
                  data:result.seriesData,
                  type: "bar",
                },
              ],
            });
        });
      }else{
        // this.$message({
        //   type:'warning',
        //   message:res.msg
        // })
      }
    },
    changeonline(val){
       const findData = (arr, key) => {
          // 遍历数组中的每个对象
          for (const item of arr) {
            // 检查当前对象是否包含目标键
            if (item.hasOwnProperty(key)) {
              // 返回找到的对应值
              return item[key];
            }
          }
          // 如果没有找到，返回null或空数组
          return null;
        };
      // 执行查找
        const result = findData(this.yshjdate, val).slice(1);
        // 去掉外层key，提取内层数据
        const ljsfxChartList = result.map(item => {
          // Object.values(item) 会返回当前对象的所有值组成的数组（此处只有1个值）
          return Object.values(item)[0];
        });
        // console.info(ljsfxChartList,'ljsfxChartList')
        this.getLjsfx(ljsfxChartList)
    },
    // 安全获取分数数据
    getScoreData(row, subject, field) {
      if (row && row.subjects && row.subjects[subject] && row.subjects[subject][field] !== undefined) {
        return row.subjects[subject][field];
      }
      return '-';
    },
    gksxfxChange(val){
      this.gksxfxTab = val
      this.getGksxfx(this.xmxx.id)
    },
    //各科上线分析
    async getGksxfx(id) {
      try {
          let obj={
            examId:id,
            subjectGroup:this.$route.query.type,
            isEndow:this.fftype
          }
          const res = await subjectAnalyse(obj)
          if(res.code==200){
            console.info(this.gksxfxTab,'rssssss')
            const filteredData = res.data.find(item => {
              // 检查当前对象的key是否包含目标type（因每个对象只有一个key，直接取keys判断）
              return Object.keys(item).includes(this.gksxfxTab);
            });
            console.info(filteredData,'this.gksxfxTab')
            // 若找到，提取type对应的值（即学校数组）；若未找到，返回空数组
            const result = filteredData ? filteredData[this.gksxfxTab] : [];
            console.info(result,'reslut')
            // 原始数据是数组，每个元素是{ "学校名": [科目数组] }，取第一个元素的value
            const schoolDataArray = result.length 
              ? Object.values(result[0])[0] || [] 
              : [];
            // 2. 处理数据格式（补充计算字段：单科过线率%）
            this.subjectAnalyseList = schoolDataArray.map(item => ({
              examSubjectName: item.examSubjectName, // 科目名
              lineScore: item.lineScore, // 分数线
              singleLineNum: item.singleLineNum ?? 0, // 单上线人数（处理null）
              doubleLineNum: item.doubleLineNum ?? 0, // 双上线人数（处理null）
              // 命中率：保留2位小数并转百分比（原始数据是小数，如0.6061→60.61%）
              hitRate: item.hitRate !== null ? item.hitRate : "-",
              // 贡献率：同上
              contributionRate: item.contributionRate !== null ? item.contributionRate: "-",
              // 单科过线率：(单上线人数/总人数)×100%，保留2位小数
              onlineRate:item.onlineRate?item.onlineRate:"-"
            }));
            let xaira = this.subjectAnalyseList.map(item => {
              return {name: item.examSubjectName}
            });
            let mzl = this.subjectAnalyseList.map(item=>{return item.hitRate})
            let gxl = this.subjectAnalyseList.map(item=>{return item.contributionRate})
            console.info(xaira,'xaira')
            this.gksxfxChart.setOption({
              legend: {
                data: ["命中率M1", "贡献率M2"],
                left: 20,
              },
              radar: {
                indicator:xaira,
              },
              series: [
                {
                  type: "radar",
                  data: [
                    {
                      value: mzl,
                      name: "命中率M1",
                    },
                    {
                      value: gxl,
                      name: "贡献率M2",
                    },
                  ],
                },
              ],
            });
          }else{
            this.$message({
              type:"warning",
              message:res.msg
            })
          }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败11：', error); // 打印错误日志，便于排查
          // this.$message({
          //   type: 'error',
          //   message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          // });
      }
    },
    //命中率贡献率
    getTargetData(arr, targetKey) {
      for (const item of arr) {
        // 检查当前对象是否包含目标 key
        if (item.hasOwnProperty(targetKey)) {
          return item[targetKey]; // 返回 key 对应的 value（即嵌套数组）
        }
      }
      return null; // 未找到时返回 null
    },
    //试题得分率
    // 根据维度和题号获取对应的分数
    async questionScoreRateTab() {
      try {
        // 1. 准备请求参数
        const reqParams = {
          examId: this.xmxx.id,
          subjectId: this.subjectId || undefined // 简化写法
        };

        // 2. 发起接口请求
        const res = await questionScoreRate(reqParams);

        // 3. 处理成功响应
        if (res.code === 200) {
          // 3.1 存储接口返回的完整数据（供getScoreRate后续查询）
          this.scoreData = res.data;

          // 3.2 生成维度数据（左侧第一列：学校、联考等）
          this.tableDatarate = Object.keys(res.data).map(key => ({
            dimension: key
          }));

          // 3.3 生成表头数据（题型+题号：单选1、单选2等）
          const firstDimension = Object.keys(res.data)[0];
          this.questionHeaders = firstDimension ? res.data[firstDimension] : [];
        } else {
          this.$message.warning(res.msg);
          // 错误时重置数据，避免残留旧数据
          this.resetScoreData();
        }
      } catch (error) {
        // 捕获网络错误等异常
        this.$message.error("数据请求失败，请重试");
        this.resetScoreData();
      }
    },

    // 分数查询方法（依赖实例中的scoreData，无需额外传obj）
    getScoreRate(dimension, questionNumber) {
      // 层层判空，避免报错
      if (!this.scoreData[dimension]) return "-";
      
      const targetQuestion = this.scoreData[dimension].find(item => 
        item.questionNumber === questionNumber
      );
      return targetQuestion ? (targetQuestion.rateScore*100).toFixed(2) : "-";
    },

    // 辅助方法：重置数据（错误/清空时调用）
    resetScoreData() {
      this.scoreData = {};
      this.tableDatarate = [];
      this.questionHeaders = [];
    },
    //试题分析
    async questionDistributetab(){
      try {
          let obj={
            examId:this.xmxx.id,
            examSubjectId:this.subjectId?this.subjectId:undefined
          }
          const res = await questionDistribute(obj)
          if(res.code==200){
            const parsedArray = res.data.map(item => {
              try {
                // 尝试解析 JSON 字符串为数组
                const answerArray = JSON.parse(item.answer);
                // 返回新对象（原对象不变，添加 parsedAnswer 字段存储解析后的数组）
                return {
                  ...item,
                  parsedAnswer: answerArray // 解析后的数组
                };
              } catch (error) {
                // 解析失败时返回默认值（避免程序中断）
                console.error(`解析 answer 失败：${error.message}`, item.answer);
                return {
                  ...item,
                  parsedAnswer: [] // 解析失败时返回空数组
                };
              }
            });
            this.questionDistributeList = parsedArray
            console.info(parsedArray,'parsedArray')
            
          }else{
            // this.$message({
            //   type:"warning",
            //   message:res.msg
            // })
          }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败12：', error); // 打印错误日志，便于排查
          // this.$message({
          //   type: 'error',
          //   message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          // });
      }
    },
    
    //试题作答分布
    mzlgxlChange(val){
      this.mzlgxlTab = val
      this.onlinesubjectCompareTap(this.xmxx.id,1)
    },
    changesxjfdb(val){
      this.sxjfdbTab = val
      this.onlinesubjectCompareTap(this.xmxx.id,2)
    },
    async onlinesubjectCompareTap(id){
      try {
          let obj={
            examId:id,
            subjectGroup:this.$route.query.type,
            isEndow:this.fftype
          }
          const res = await subjectCompare(obj)
          if(res.code==200){
            // 1. 处理目标数据（确保targetData格式正确）
            const targetData = this.getTargetData(res.data, this.mzlgxlTab);
              // 校验targetData是否为数组（避免非数组导致reduce报错）
                if (!Array.isArray(targetData)) {
                  // this.$message.warning("数据格式异常");
                  return;
                }
                // 2. 扁平化数据（去掉外层对象key）
                const flattenedData = targetData.reduce((acc, item) => {
                  const values = Object.values(item);
                  // 只保留对象类型的value（避免非对象数据污染）
                  const validValues = values.filter(v => typeof v === "object" && v !== null);
                  return acc.concat(...validValues);
                }, []);
                // console.info("flattenedData:", flattenedData);
                // 3. 获取唯一科目（同一科目取第一个班级的人数，或累加人数）
                const uniqueSubjectsMap = {};
                flattenedData.forEach(item => {
                  const subjectName = item.examSubjectName;
                  if (!uniqueSubjectsMap[subjectName]) {
                    uniqueSubjectsMap[subjectName] = {
                      name: subjectName,
                      // 若同一科目不同班级人数不同，可改为累加：peopleNum: item.peopleNum || 0
                      peopleNum: item.peopleNum ?? 0 
                    };
                  }
                });
                this.uniqueSubjects = Object.values(uniqueSubjectsMap);
                // 4. 按班级分组（核心：嵌套科目数据）
                const classGroups = {};
                flattenedData.forEach(item => {
                  const { className, examSubjectName } = item;
                  // 初始化班级对象
                  if (!classGroups[className]) {
                    classGroups[className] = { className };
                  }
                  // 嵌套科目数据（覆盖同一班级同一科目的重复数据，或按需处理）
                  classGroups[className][examSubjectName] = {
                    fullScoreLineNum: item.fullScoreLineNum ?? "-",
                    singleLineNum: item.singleLineNum ?? "-",
                    doubleLineNum: item.doubleLineNum ?? "-",
                    criticalNum: item.criticalNum ?? "-",
                    hitRate: item.hitRate ?? "-",
                    lineAvgScore:item.lineAvgScore ?? "-",
                    lineAvgScoreRank:item.lineAvgScoreRank ?? "-"
                  };
                });
                this.onlinesubjectCompareList = Object.values(classGroups);

              const targetData1 = this.getTargetData(res.data, this.sxjfdbTab);
              // 校验targetData是否为数组（避免非数组导致reduce报错）
                if (!Array.isArray(targetData1)) {
                  // this.$message.warning("数据格式异常");
                  return;
                }
                // 2. 扁平化数据（去掉外层对象key）
                const flattenedData1 = targetData1.reduce((acc, item) => {
                  const values = Object.values(item);
                  // 只保留对象类型的value（避免非对象数据污染）
                  const validValues = values.filter(v => typeof v === "object" && v !== null);
                  return acc.concat(...validValues);
                }, []);
                // console.info("flattenedData:", flattenedData);
                // 3. 获取唯一科目（同一科目取第一个班级的人数，或累加人数）
                const uniqueSubjectsMap1 = {};
                flattenedData1.forEach(item => {
                  const subjectName = item.examSubjectName;
                  if (!uniqueSubjectsMap1[subjectName]) {
                    uniqueSubjectsMap1[subjectName] = {
                      name: subjectName,
                      // 若同一科目不同班级人数不同，可改为累加：peopleNum: item.peopleNum || 0
                      peopleNum: item.peopleNum ?? 0 
                    };
                  }
                });
                this.uniqueSubjects1 = Object.values(uniqueSubjectsMap1);
                // 4. 按班级分组（核心：嵌套科目数据）
                const classGroups1 = {};
                flattenedData1.forEach(item => {
                  const { className, examSubjectName } = item;
                  // 初始化班级对象
                  if (!classGroups1[className]) {
                    classGroups1[className] = { className };
                  }
                  // 嵌套科目数据（覆盖同一班级同一科目的重复数据，或按需处理）
                  classGroups1[className][examSubjectName] = {
                    fullScoreLineNum: item.fullScoreLineNum ?? "-",
                    singleLineNum: item.singleLineNum ?? "-",
                    doubleLineNum: item.doubleLineNum ?? "-",
                    criticalNum: item.criticalNum ?? "-",
                    hitRate: item.hitRate ?? "-",
                    lineAvgScore:item.lineAvgScore ?? "-",
                    lineAvgScoreRank:item.lineAvgScoreRank ?? "-"
                  };
                });
              this.onlinesubjectCompareList1 = Object.values(classGroups1);
          }else{
            // this.$message({
            //   type:'warning',
            //   message:res.msg
            // })
          }
      } catch (error) {
          // 捕获接口请求失败（如网络错误、跨域问题、超时等）
          console.error('数据请求失败13：', error); // 打印错误日志，便于排查
          // this.$message({
          //   type: 'error',
          //   message: '网络异常，无法获取数据，请稍后重试' // 友好提示用户
          // });
      }
    },
    getLjsfx(data) {
      console.info(data,'data-data')
      if (this.ljsfxChart) {
        this.ljsfxChart.clear(); 
      }
      let classList = data.map(item=>{return item.className})
      let passCriticalNum = data.map(item=>{return item.passCriticalNum})
      let noPassCriticalNum = data.map(item=>{return item.noPassCriticalNum})
      
      // console.info(noPassCriticalNum,'sss')
      // console.info(passCriticalNum,'dddd')
      this.ljsfxChart.setOption({
        // 添加图例配置
        legend: {
          data: ['上线临界', '未上线临界'],
          top: '0%',          // 图例顶部对齐图表顶部
          left: 'center',     // 图例水平居中
          orient: 'horizontal', // 水平排列
          itemWidth: 12,      // 图例标记宽度
          itemHeight: 12,     // 图例标记高度
          textStyle: {
            color: '#333333',  // 图例文字颜色
            fontSize: 14       // 图例文字大小
          },
          // 图例背景样式
          backgroundColor: 'transparent',
          // 图例项之间的间距
          itemGap: 20
        },
        xAxis: {
          type: "category",
          data: classList,
        },
        yAxis: {
          type: "value",
        },
        series: [
          {
            data: passCriticalNum,
            type: "bar",
            name: "上线临界"
          },
          {
            data: noPassCriticalNum,
            type: "bar",
            name: "未上线临界"
          },
        ],
      }, { notMerge: true });
    },
    backTop() {
      window.scrollTo({
        top: 0,
        behavior: "smooth",
      });
    },
    handleCommand(command) {
      // this.$refs[command].scrollIntoView({ behavior: "smooth" });
      let offsetTop = this.getDistanceFromHtmlTop(this.$refs[command]);
      window.scrollTo({
        top: offsetTop - 20,
        behavior: "smooth",
      });
    },
    getDistanceFromHtmlTop(element) {
      if (!element) return 0;

      // 获取元素相对于视口的位置
      const rect = element.getBoundingClientRect();

      // 获取页面当前的滚动距离
      const scrollTop =
        window.pageYOffset ||
        document.documentElement.scrollTop ||
        document.body.scrollTop ||
        0;

      // 计算绝对距离
      return Math.round(rect.top + scrollTop);
    },
  },
};
</script>

<style lang="scss" scoped>
.app-container {
  height: auto;
  width: 1300px;
  margin-left: auto;
  margin-right: auto;
  .colorBlack{
    i{
      font-style:normal;
      color:#333
    }
  }
  .top-tabs {
    display: flex;
    padding: 0;
    padding-right: 24px;
    line-height: 54px;
    .page-back {
      height: 54px;
      color: #ffffff;
      background: #1a48db;
      font-size: 14px;
      font-weight: bold;
      margin-right: 24px;
      padding: 0 10px;
      text-align: center;
      cursor: pointer;
      flex-shrink: 0;
    }

    .el-tabs {
      width: calc(100% - 80px);
    }
  }

  h3,
  h4 {
    margin-top: 0;
    font-weight: bold;
    color: #333;
    display: flex;
    justify-content: space-between;
    align-items: center;
  }

  h3:not(:first-child) {
    margin-top: 40px;
  }
  .excellentTitle{
    margin-top:40px;
    display: flex;
    align-items: center;
    justify-content: space-between;
  }

  .page-card {
    .statistics-box {
      display: flex;
      justify-content: space-between;
      margin-bottom: 30px;

      .statistics-item {
        width: 180px;
        text-align: center;
        p {
          margin: 0;
          line-height: 1.4;

          & + p {
            font-weight: bold;
            color: #722ed1;
          }
        }

        &:nth-child(2) p + p {
          color: #ff7d00;
        }
        &:nth-child(3) p + p {
          color: #0fc6c2;
        }
        &:nth-child(4) p + p {
          color: #165dff;
        }
      }
    }

    .echarts-box {
      height: 500px;
    }

    .flex {
      display: flex;
      height: 400px;
    }
  }
}

.snippet {
  background: #f8f9fa;
  padding: 20px;
  margin-bottom: 20px;
  color: #999999;

  &.danger {
    color: #ea0000;
    background: #ffc7c7;

    h4 {
      color: #ea0000;
    }
  }
  &.mini {
    padding: 5px 20px;
    display: flex;
    align-items: center;
    .el-input {
      width: 100px;
      margin-left: 5px;
    }
  }

  h4 {
    font-weight: bold;
    color: #999999;
  }
  div {
    font-size: 16px;
    line-height: 30px;
  }
}

.roll {
  position: fixed;
  right: 100px;
  bottom: 150px;
  background-color: rgb(255, 255, 255);
  cursor: pointer;
  box-shadow: rgba(0, 0, 0, 0.12) 0px 0px 6px;
  border-radius: 50%;

  div {
    width: 40px;
    height: 40px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
  }

  &.roll-top {
    right: 150px;
  }
}
</style>
<style scoped>
    >>> .el-tabs__item{
      padding:0 19px;
    }
</style>